<?xml version='1.0'?>
<xsl:stylesheet
  xmlns:AST="http://www.phpcompiler.org/phc-1.1"
  xmlns:past="http://www.parrotcode.org/PAST-0.1"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0" >

<xsl:output method='xml' indent='yes' />
<xsl:strip-space  elements="*"/>


<!--

TODO: AST:source_rep

-->
<!--

$Id: phc_xml_to_past_xml.xsl 33276 2008-11-27 20:12:54Z bernhard $

This transformation takes a XML abstract syntax tree as generated
by PHC from PHP source code. It generates an XML representation of a PAST data structure.

-->

<!--

structure: 

ELEMENT AST:PHP_script
    ELEMENT AST:Statement_list
      ELEMENT AST:Class_def
        ELEMENT AST:Class_mod
        ELEMENT AST:CLASS_NAME
        ELEMENT AST:CLASS_NAME
        ELEMENT AST:INTERFACE_NAME_list
        ELEMENT AST:Member_list

AST:Actual_parameter
AST:Actual_parameter_list
AST:Array
AST:Array_elem
AST:Array_elem_list
AST:Assignment
AST:Attr_mod
AST:Attribute
     AST:BOOL /bool
AST:Bin_op
AST:Break
AST:CAST
AST:CLASS_NAME
AST:CONSTANT_NAME
AST:Cast
AST:Class_def
AST:Class_mod
AST:Conditional_expr
AST:Constant
AST:Continue
AST:Do
AST:Eval_expr
AST:Expr
AST:Expr_list
AST:For
AST:Foreach
AST:Formal_parameter
AST:Formal_parameter_list
AST:Global
AST:INT
AST:INTERFACE_NAME_list
AST:If
AST:Ignore_errors
AST:Instanceof
AST:List_assignment
AST:List_element_list
AST:METHOD_NAME
AST:Member_list
AST:Method
AST:Method_invocation
AST:Method_mod
AST:NIL
AST:Name_with_default
AST:Name_with_default_list
AST:New
AST:Nop
AST:OP
AST:Op_assignment
AST:PHP_script
AST:Post_op
AST:Pre_op
AST:Reflection
AST:Return
AST:STRING
AST:Signature
AST:Statement_list
AST:Static_declaration
AST:Switch
AST:Switch_case
AST:Switch_case_list
AST:Target
AST:Throw
AST:Type
AST:Unary_op
AST:VARIABLE_NAME
AST:Variable
AST:Variable_name_list
AST:While
attr
attrs

integer
string
string_list
value

-->

<xsl:template match="/">
  <root>
  <xsl:apply-templates select="AST:PHP_script" />
</root>
</xsl:template>

<xsl:template match="AST:PHP_script" >
  <!--
       each script has a set of statements
       -->
  <xsl:apply-templates select="AST:Statement_list" />
</xsl:template>


<!--
<xsl:template match="AST:Statement_list/AST:Class_def"><xsl:apply-templates select="AST:Class_def"/></xsl:template>

-->
<xsl:template match="AST:PHP_script/AST:Statement_list" >

  <Statement_list>
  <xsl:apply-templates select="AST:Class_def" />

  <past:Stmts>
    <xsl:apply-templates select="AST:Eval_expr" />
    <xsl:apply-templates select="AST:If" />
  </past:Stmts>
</Statement_list>
</xsl:template>





<!-- 
<xsl:template match="AST:Class_def[AST:CLASS_NAME[value='%MAIN%']]">
  <xsl:apply-templates select="AST:Member_list" />
</xsl:template>

     even if there is no main.
-->

<xsl:template match="AST:Class_def">

  <ClassDef>
  <xsl:apply-templates select="AST:Class_mod"/>

  <xsl:apply-templates select="AST:CLASS_NAME"/>

  <xsl:apply-templates select="AST:Member_list" />
</ClassDef>

</xsl:template>


<!--
[AST:Signature[AST:METHOD_NAME[value='%run%']]]
-->
<xsl:template match="AST:Method">
  <Method>
  <xsl:apply-templates select="AST:Signature" />
  <xsl:apply-templates select="AST:Statement_list" />
</Method>
</xsl:template>



<xsl:template match="AST:Eval_expr" >
  <xsl:apply-templates select="AST:Method_invocation" />
  <xsl:apply-templates select="AST:Assignment" />
</xsl:template>

<xsl:template match="AST:Method_invocation" >
  <Method_invocation>
  <past:Op>
    <xsl:attribute name="name" ><xsl:value-of select="AST:METHOD_NAME/value" /></xsl:attribute>
    <xsl:apply-templates select="AST:Actual_parameter_list" />
  </past:Op>
</Method_invocation>
</xsl:template>

<xsl:template match="AST:Actual_parameter_list" >
  <xsl:apply-templates select="AST:Actual_parameter" />
</xsl:template>

<xsl:template match="AST:Actual_parameter" >
  <xsl:apply-templates select="  AST:Method_invocation
                               | AST:STRING
                               | AST:INT
                               | AST:BOOL
                               | AST:NULL
                               | AST:REAL
                               | AST:Bin_op
                               | AST:Unary_op
                               | AST:Variable 
                               | AST:Constant" />
</xsl:template>

<xsl:template match="AST:Bin_op" >
  <Bin_op>
    <attrs>
    <xsl:apply-templates select="attrs"/>
  </attrs>
  <OP>
    <xsl:apply-templates select="AST:Op"/>
  </OP>

  <past:Op>

    <xsl:attribute name="pirop" >
      <xsl:choose>
        <xsl:when test="AST:OP/value = '+'" >n_add</xsl:when>
        <xsl:when test="AST:OP/value = '-'" >n_sub</xsl:when>
        <xsl:when test="AST:OP/value = '*'" >n_mul</xsl:when>
        <xsl:when test="AST:OP/value = '/'" >n_div</xsl:when>
        <xsl:when test="AST:OP/value = '%'" >n_mod</xsl:when>
      </xsl:choose>
    </xsl:attribute>

    <xsl:attribute name="name" >
      <xsl:choose>
        <xsl:when test="AST:OP/value/@encoding = 'base64'" >
          <xsl:choose>
            <xsl:when test="AST:OP/value = 'PA=='" >infix:&lt;</xsl:when>
            <xsl:when test="AST:OP/value = 'PD0='" >infix:&lt;=</xsl:when>
            <xsl:when test="AST:OP/value = 'Pj0='" >infix:&gt;=</xsl:when>
            <xsl:when test="AST:OP/value = 'Pg=='" >infix:&gt;</xsl:when>
            <xsl:when test="AST:OP/value = 'Jg=='" >infix:&amp;</xsl:when>
          </xsl:choose>
        </xsl:when>
        <xsl:when test="AST:OP/value = '&amp;&amp;'" >infix:AND</xsl:when>
        <xsl:when test="AST:OP/value = '||'" >infix:OR</xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat('infix:', AST:OP/value)" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:attribute>

    <xsl:apply-templates select="  AST:STRING
                                 | AST:INT
                                 | AST:REAL
                                 | AST:Bin_op
                                 | AST:Unary_op
                                 | AST:Variable
                                 | AST:Constant" />

  </past:Op>
</Bin_op>
</xsl:template>

<xsl:template match="AST:Unary_op" >
<Unary_op>
  <past:Op >
    <xsl:attribute name="name" >
      <xsl:value-of select="concat('prefix:', AST:OP/value)" />
    </xsl:attribute>
    <xsl:apply-templates select="  AST:INT
                                 | AST:REAL
                                 | AST:Bin_op
                                 | AST:Unary_op" />
  </past:Op>
</Unary_op>
</xsl:template>

<!-- value assignment -->
<xsl:template match="AST:Assignment[string(AST:BOOL) = 'false']" >
  <past:Op name='infix:=' pasttype='bind' >
    <xsl:apply-templates select="AST:Variable" />
    <xsl:apply-templates select="  AST:STRING
                                 | AST:INT
                                 | AST:Bin_op
                                 | AST:Constant" />
  </past:Op>
</xsl:template>

<!-- aliasing -->
<xsl:template match="AST:Assignment[string(AST:BOOL) = 'true']" >
  <past:Op name='infix::=' pasttype='bind' >
    <xsl:apply-templates select="AST:Variable" />
    <xsl:apply-templates select="  AST:STRING
                                 | AST:INT
                                 | AST:Bin_op
                                 | AST:Constant" />
  </past:Op>
</xsl:template>

<xsl:template match="AST:Variable" >
  <past:Var scope="package" >
    <xsl:attribute name="name" >
      <xsl:value-of select="concat( '$', AST:VARIABLE_NAME/value )" />
    </xsl:attribute>
  </past:Var>
</xsl:template>



<xsl:template match="AST:Variable[ AST:Expr_list/AST:STRING | AST:Expr_list/AST:INT ]" >
  <past:Var scope="keyed" viviself="Undef" lvalue="1" >
    <xsl:choose>
      <xsl:when test="AST:VARIABLE_NAME/value = '_GET' or AST:VARIABLE_NAME/value = '_POST'" >
        <past:Var scope="package" >
          <xsl:attribute name="name" ><xsl:value-of select="concat( '$', AST:VARIABLE_NAME/value )" /></xsl:attribute>
        </past:Var>
      </xsl:when>
      <xsl:otherwise>
        <past:Var viviself="PhpArray" scope="package" lvalue="1" >
          <xsl:attribute name="name" ><xsl:value-of select="concat( '$', AST:VARIABLE_NAME/value )" /></xsl:attribute>
        </past:Var>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:apply-templates select="  AST:Expr_list/AST:STRING
                                 | AST:Expr_list/AST:INT" />
  </past:Var>
</xsl:template>

<xsl:template match="AST:Constant" >
  <past:Op name="constant" >
    <past:Val returns="PhpString" >
      <xsl:attribute name="value" ><xsl:value-of select="AST:CONSTANT_NAME/value" /></xsl:attribute>
    </past:Val>
  </past:Op>
</xsl:template>

<xsl:template match="AST:STRING" >
  <past:Val returns="PhpString" >
    <xsl:attribute name="encoding" ><xsl:value-of select="value/@encoding" /></xsl:attribute>
    <xsl:attribute name="value" ><xsl:value-of select="value" /></xsl:attribute>
  </past:Val>
</xsl:template>

<xsl:template match="AST:INT" >
  <past:Val returns="PhpInteger" >
    <xsl:attribute name="value" ><xsl:value-of select="value" /></xsl:attribute>
  </past:Val>
</xsl:template>

<xsl:template match="AST:BOOL" >
  <past:Val returns="PhpBoolean" >
    <xsl:attribute name="value" ><xsl:choose>
      <xsl:when test="value = 'True'"  >1</xsl:when>
      <xsl:when test="value = 'False'" >0</xsl:when>
    </xsl:choose></xsl:attribute>
  </past:Val>
</xsl:template>

<xsl:template match="AST:BOOL" >
  <past:Val returns="PhpNull" >
    <xsl:attribute name="value" >0</xsl:attribute>
  </past:Val>
</xsl:template>

<!-- looks like phc is running into a floating point issue -->
<xsl:template match="AST:REAL" >
  <past:Val returns='PhpFloat' >
    <xsl:attribute name="value" ><xsl:value-of select="AST:source_rep" /></xsl:attribute>
  </past:Val>
</xsl:template>

<xsl:template match="  value
                     | AST:source_rep" >
  <xsl:value-of select="." />
</xsl:template>

<xsl:template match="AST:If" >
  <past:Op pasttype="if" >
    <xsl:apply-templates select="  AST:STRING
                                 | AST:INT
                                 | AST:REAL
                                 | AST:Bin_op
                                 | AST:Unary_op
                                 | AST:Variable
                                 | AST:Constant" />
    <past:Block blocktype="immediate" >
      <xsl:apply-templates select="AST:Statement_list[1]" />
    </past:Block>
    <past:Block blocktype="immediate" >
      <xsl:apply-templates select="AST:Statement_list[2]" />
    </past:Block>
  </past:Op>
</xsl:template>



<!-- 
     here are the relationships extracted from the
     mediawiki code
-->
<xsl:template match="AST:Actual_parameter_list/AST:Actual_parameter"><xsl:apply-templates select="AST:Actual_parameter"/></xsl:template>

<xsl:template match="AST:Class_mod/attrs"><xsl:apply-templates select="attrs"/></xsl:template>

<xsl:template match="AST:Expr_list/AST:Bin_op"><xsl:apply-templates select="AST:Bin_op"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:Bin_op"><xsl:apply-templates select="AST:Bin_op"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:Expr"><xsl:apply-templates select="AST:Expr"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:INT"><xsl:apply-templates select="AST:INT"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:Method_invocation"><xsl:apply-templates select="AST:Method_invocation"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:Post_op"><xsl:apply-templates select="AST:Post_op"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:STRING"><xsl:apply-templates select="AST:STRING"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:Variable"><xsl:apply-templates select="AST:Variable"/></xsl:template>
<xsl:template match="AST:If/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:METHOD_NAME/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Member_list/AST:Attribute"><xsl:apply-templates select="AST:Attribute"/></xsl:template>
<xsl:template match="AST:Method/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Method_invocation/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Statement_list/AST:Eval_expr"><xsl:apply-templates select="AST:Eval_expr"/></xsl:template>
<xsl:template match="AST:Statement_list/AST:If"><xsl:apply-templates select="AST:If"/></xsl:template>
<xsl:template match="AST:Unary_op/attrs"><xsl:apply-templates select="attrs"/></xsl:template>


<xsl:template match="attr/bool"><xsl:apply-templates select="bool"/></xsl:template>
<xsl:template match="attr/integer"><xsl:apply-templates select="integer"/></xsl:template>
<xsl:template match="attr/string"><xsl:apply-templates select="string"/></xsl:template>
<xsl:template match="attr/string_list"><xsl:apply-templates select="string_list"/></xsl:template>
<xsl:template match="attrs/attr">
  <name>
    <xsl:value-of select="@key" />
  </name>

<xsl:apply-templates select="attr"/></xsl:template>

<xsl:template match="string_list/string"><xsl:apply-templates select="string"/></xsl:template>

<!-- 
     no pattern found for :
-->
<!-- Array -->
<!-- Array_elem_list -->
<!-- CLASS_NAME -->
<!-- Class_def -->
<!-- Expr -->
<!-- Formal_parameter -->
<!-- Formal_parameter_list -->
<!-- INTERFACE_NAME_list -->
<!-- METHOD_NAME -->
<!-- Member_list -->
<!-- Method -->
<!-- Method_mod -->
<!-- NIL -->
<!-- Name_with_default -->
<!-- Signature -->
<!-- Type -->
<!-- VARIABLE_NAME -->
<!-- attrs -->
<!-- bool -->
<!-- value -->
<xsl:template match="AST:Actual_parameter/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Array/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Array_elem/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Array_elem_list/AST:Array_elem"><xsl:apply-templates select="AST:Array_elem"/></xsl:template>
<xsl:template match="AST:Assignment/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Attr_mod/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Attribute/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:BOOL/attrs"><xsl:apply-templates select="attrs"/></xsl:template>


<xsl:template match="AST:Expr_list/AST:Bin_op"><xsl:apply-templates select="AST:Bin_op"/></xsl:template>
<xsl:template match="AST:Bin_op/attrs"><xsl:apply-templates select="attrs"/></xsl:template>


<xsl:template match="AST:Break/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:CAST/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:CLASS_NAME/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:CONSTANT_NAME/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Cast/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Class_def/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Class_mod/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Conditional_expr/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Constant/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Continue/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Do/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Eval_expr/attrs"><xsl:apply-templates select="attrs"/></xsl:template>



<xsl:template match="AST:Expr_list/AST:Expr"><xsl:apply-templates select="AST:Expr"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:INT"><xsl:apply-templates select="AST:INT"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:Method_invocation"><xsl:apply-templates select="AST:Method_invocation"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:Post_op"><xsl:apply-templates select="AST:Post_op"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:STRING"><xsl:apply-templates select="AST:STRING"/></xsl:template>
<xsl:template match="AST:Expr_list/AST:Variable"><xsl:apply-templates select="AST:Variable"/></xsl:template>
<xsl:template match="AST:For/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Foreach/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Formal_parameter/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Formal_parameter_list/AST:Formal_parameter"><xsl:apply-templates select="AST:Formal_parameter"/></xsl:template>
<xsl:template match="AST:Global/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:INT/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:If/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Ignore_errors/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Instanceof/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:List_assignment/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:METHOD_NAME/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Member_list/AST:Attribute"><xsl:apply-templates select="AST:Attribute"/></xsl:template>
<xsl:template match="AST:Method/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Method_invocation/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Method_mod/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:NIL/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Name_with_default/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Name_with_default_list/AST:Name_with_default"><xsl:apply-templates select="AST:Name_with_default"/></xsl:template>
<xsl:template match="AST:New/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Nop/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:OP/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Op_assignment/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Post_op/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Pre_op/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Reflection/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Return/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:STRING/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Signature/attrs"><xsl:apply-templates select="attrs"/></xsl:template>

<xsl:template match="AST:Static_declaration/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Switch/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Switch_case/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Throw/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Type/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Unary_op/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:VARIABLE_NAME/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Variable/attrs"><xsl:apply-templates select="attrs"/></xsl:template>
<xsl:template match="AST:Variable_name_list/AST:VARIABLE_NAME"><xsl:apply-templates select="AST:VARIABLE_NAME"/></xsl:template>
<xsl:template match="AST:While/attrs"><xsl:apply-templates select="attrs"/></xsl:template>



<xsl:template match="attr/bool"><xsl:apply-templates select="bool"/></xsl:template>
<xsl:template match="attrs/attr"><xsl:apply-templates select="attr"/></xsl:template>

<xsl:template match="AST:Eval_expr/attrs"><xsl:apply-templates select="attrs"/></xsl:template>

<xsl:template match="bool/text()">
  <!-- skip -->
</xsl:template>

<xsl:template match="AST:Method/AST:Signature/AST:METHOD_NAME/value/text()">
  <MethodSignature>
    <xsl:value-of select="."></xsl:value-of>
  </MethodSignature>
</xsl:template>

<xsl:template match="AST:Method/AST:Statement_list" >
  <MethodStmtList>
<xsl:apply--templates select="AST:Continue"/>
<xsl:apply--templates select="AST:Eval_expr"/>
<xsl:apply--templates select="AST:For"/>
<xsl:apply--templates select="AST:Foreach"/>
<xsl:apply--templates select="AST:Global"/>
<xsl:apply--templates select="AST:If"/>
<xsl:apply--templates select="AST:Nop"/>
<xsl:apply--templates select="AST:Return"/>
<xsl:apply--templates select="AST:Static_declaration"/>
<xsl:apply--templates select="AST:Switch"/>
<xsl:apply--templates select="AST:Throw"/>
<xsl:apply-templates select="AST:Break"/>
<xsl:apply-templates select="AST:While"/>
</MethodStmtList>

</xsl:template>

<xsl:template match="AST:Class_def/AST:CLASS_NAME/value/text()">
  <ClassName>
    <!--
    <parent>      
    <xsl:value-of select="name(../../../../../..)"></xsl:value-of>/
    <xsl:value-of select="name(../../../../..)"></xsl:value-of>/
    <xsl:value-of select="name(../../../..)"></xsl:value-of>/
    <xsl:value-of select="name(../../..)"></xsl:value-of>/
    <xsl:value-of select="name(../..)"></xsl:value-of>/
    <xsl:value-of select="name(..)"></xsl:value-of>/
    </parent>
-->
    <xsl:value-of select="."></xsl:value-of>
  </ClassName>
</xsl:template>


<xsl:template match="text()">
  <sometext>
    <parent>
      <xsl:value-of select="name(../../../..)"></xsl:value-of>/
      <xsl:value-of select="name(../../..)"></xsl:value-of>/
      <xsl:value-of select="name(../..)"></xsl:value-of>/
      <xsl:value-of select="name(..)"></xsl:value-of>/
    </parent>
    <xsl:value-of select="."></xsl:value-of>
  </sometext>
</xsl:template>


</xsl:stylesheet>
